• 问题

    当不确定参数个数的时候可以采用可变参数,那么,在使用可变参数时有哪些需要注意的?

  • 解决

    1. 可变参数可以被用来接受0个或者多个指定类型的参数。

      示例:当方法需要1个或者多个参数的方法时,直接使用可变参数就会变得不优雅:

      public static min(int...args){
          if(args.length==0){
              throw new IllegalrgumentException("Too few arguments!");
          }
          ....
      }
      

      由于该方法要求参数至少有1个,但是可变参数可以接受的是0个或者多个指定类型的参数,因此需要判断当前的参数args的长度是否为0,最终的结果是将这种检验放到了运行时而不是编译时。针对这种情况,做这样的调整:

      public static min(int defaultParam, int...args){
          ....
      }
      

      由于通过方法入参要求了必须传入一个参数defaultParam,因此就少了参数个数的判断,方法变得优雅。

      使用可变参数的规律为:方法强制要求的默认参数,在方法入参明确给出,可变参数用于进行兜底不确定参数个数的情况。

    2. 遍历数组

      采用Arrays.toString()方法遍历数组,而不要采用Arrays.toList().toString去遍历数组,这是因为toList方法接受的是可变参数,如果想要正确输出数组内容的话,数组里元素必须是对象引用型数据,而不能是基本类型数据。如下例:

      List<String> homophones = Arrays.asList("to", "too", "two");
      System.out.println(homophones);
      int[] digits = { 1, 2, 3, 4, 5 };
      System.out.println(Arrays.asList(digits));
      //输出结果为
      [to, too, two]
      [[I@15db9742]
      

      当数组元素为int基本类型数据时,Arrays.asList方法将int类型的数组的引用集中到单个元素数组中,并封装成List

    3. 使用可变参数的场景

      在重视性能的情况下,使用可变参数机制要小心,因为可变参数方法的每次调用都会导致进行一次数组分配和初始化,有一种折中的解决方案,假设确定某个方法大部分调用会有3个或者更少的参数,就声明该方法的5个重载,每个重载带有0至3个普通参数,当参数数目超过3个时,使用可变参数方法。

      public void foo() {}
      public void foo() {int a1}
      public void foo() {int a1, int a2}
      public void foo() {int a1, int a2, int a3}
      public void foo() {int a1, int a2, int a3, int... rest}
      
  • 结论

    总之,和其他规则一样,尽管可变参数是一个很方便的方式,但是它们不应该被过度滥用。除非有必要,尽量不要使用这种方法。

results matching ""

    No results matching ""